import axios from "axios";
import store from "@/store/module/user";
import errorHandle from "./errorHandle";
import publicConfig from "@/config";
// import { Spin } from 'view-design'

const CancelToken = axios.CancelToken;
class HttpRequest {
  constructor(baseUrl) {
    this.baseUrl = baseUrl;
    this.pending = {}; //定义key全局
  }
  // 获取axios配置
  getInsideConfig() {
    const config = {
      baseURL: this.baseUrl,
      headers: {
        "Content-Type": "application/json;charset=utf-8",
      },
      timeout: 10000,
    };
    return config;
  }
  //删除方法 比对删除请求 返回meg
  removePending(key, isRequest = false) {
    if (this.pending[key] && isRequest) {
      this.pending[key]("取消了重复的请求");
    }
    delete this.pending[key];
  }
  // 设定拦截器
  interceptors(instance) {
    // 请求拦截器
    instance.interceptors.request.use(
      (config) => {
        // Do something before request is sent
        let isPublic = false;
        publicConfig.publicPath.map((path) => {
          isPublic = isPublic || path.test(config.url);
        });
        const token = store.state.token;
        if (!isPublic && token) {
          config.headers.Authorization = "Bearer " + token;
        }
        let key = config.url + "&" + config.method;
        this.removePending(key, true); //创建key 存储后调用remove方法比对
        config.cancelToken = new CancelToken((c) => {
          this.pending[key] = c;
        });
        return config;
      },
      (err) => {
        // debugger
        errorHandle(err);
        // Do something with request error
        return Promise.reject(err);
      }
    );

    // 响应请求的拦截器
    instance.interceptors.response.use(
      (res) => {
        // Any status code that lie within the range of 2xx cause this function to trigger
        // Do something with response data
        let key = res.config.url + "&" + res.config.method; //请求成功后删除key
        this.removePending(key);
        if (res.status === 200) {
          return Promise.resolve(res.data);
        } else {
          return Promise.reject(res);
        }
      },
      (err) => {
        // Any status codes that falls outside the range of 2xx cause this function to trigger
        // Do something with response error
        // debugger
        errorHandle(err);
        return Promise.reject(err);
      }
    );
  }
  // 创建实例
  request(options) {
    const instance = axios.create();
    const newOptions = Object.assign(this.getInsideConfig(), options);
    this.interceptors(instance);
    return instance(newOptions);
  }
  get(url, config) {
    const options = Object.assign(
      {
        method: "get",
        url: url,
      },
      config
    );
    return this.request(options);
  }
  post(url, data) {
    return this.request({
      method: "post",
      url: url,
      data: data,
    });
  }
}

export default HttpRequest;
